package com.atguigu.boot.controller;


import com.atguigu.boot.bean.Person;
import com.atguigu.boot.bean.Pet;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

/**
 * 这个是学习数据响应与内容协商时创建的Controller
 * 1. 开发单体应用时，通常是后端处理逻辑和页面在同一个单体项目里面,单体应用下,服务器处理完后就直接返回页面了(页面的数据是放在域中，比如
 *    request域,session域或applicationContext域等)
 *    
 * 2. 在前后端项目分离的情况下,后端服务通常只需要返回JSON格式的数据给前端,由前端拿到这些JSON数据渲染到页面上(前端可能会用不同的页面技术实现，比如
 *    Vue等前端框架)
  */

@Controller
public class ResponseTestController {


    @ResponseBody //--RequestResponseBodyMethodProcessor ---> messageConverter
    @GetMapping("/he11")
    public FileSystemResource file(){
        
        // String filePath = "D:\\file\\code\\IdeaProjects\\springboot2\\boot-05-web-01\\pom.xml";
        String filePath = "C:\\Users\\shg\\Desktop\\G2\\MySQL迁移到SQLite.docx";

        FileSystemResource fileSystemResource = new FileSystemResource(filePath);

        //文件以这样的方式返回看是谁处理的（messageConverter）。
        return fileSystemResource;
    }


    /**
     * 1、浏览器发请求直接返回 xml    [application/xml]        jacksonXmlConverter
     * 2、如果是ajax请求 返回 json   [application/json]      jacksonJsonConverter
     * 3、如果硅谷app发请求，返回自定义协议数据  [appliaction/x-guigu]   xxxxConverter
     *          属性值1;属性值2;
     *
     * 步骤：
     * 1、添加自定义的MessageConverter进系统底层
     * 2、系统底层就会统计出所有MessageConverter能操作哪些类型
     * 3、客户端内容协商 [guigu--->guigu]
     *
     * 作业：如何以参数的方式进行内容协商
     * @return
     */
    @ResponseBody  //利用返回值处理器里面的消息转换器进行处理
    @GetMapping(value = "/test/person")
    public Person getPerson(){
        Person person = new Person();
        person.setAge(28);
        person.setBirth(new Date());
        person.setUserName("zhangsan");
        Pet pet = new Pet();
        pet.setName("小黄");
        pet.setAge(11);
        person.setPet(pet);
        return person;
    }

    @ResponseBody  //利用返回值处理器里面的消息转换器进行处理
    @GetMapping(value = "/test/person_1",produces = {MediaType.APPLICATION_JSON_VALUE})
    public Person getPerson_1(){
        Person person = new Person();
        person.setAge(28);
        person.setBirth(new Date());
        person.setUserName("zhangsan");
        return person;
    }

}
